首先,先說明動態記憶體配置
動態記憶體配置是一種在程式運行時根據需求管理記憶體的技術,主要用於處理不確定大小的數據結構,如鏈表、樹或動態陣列。透過標準庫函數(malloc
、calloc
、realloc
和 free
),開發者可以靈活地分配和釋放記憶體。
關鍵概念
NULL
,以確保分配成功,避免在空指標上進行操作。應用場景
動態記憶體配置廣泛應用於需要靈活數據結構的情況,如:
動態記憶體配置是C語言中一個強大且靈活的功能,但需要謹慎使用,以確保程序的穩定性和性能。
程式練習(字串結合):
#include ‹stdio.h>
#include <stdlib.h>
#include <string.h>
05: int main (void)
{
int i=0, j=0;
string s1, s2, *p;
cin>>s1>>s2;
p = (char*) malloc ((strlen(s1) +strlen (s2) +1) *sizeof (char)) ;
while (* (s+i)) {
* (p+i) = * (s1+i) ;
i++;
}
while (* (s2+j)) 1
*(p+i) = * (s2+j) ;
i++; j++;
}
* (p+i) = '\0';
puts (p) ;
free (p) ;
return 0;
}
說明:
這段程式碼的目的是將兩個字串 s1
和 s2
連接起來。首先,程式使用 malloc
動態分配足夠的記憶體以儲存連接後的字串。接著,透過兩個 while
迴圈,將 s1
和 s2
的字符逐個複製到分配的記憶體中,並在最後加上字串結尾符 '\0'
。最後,使用 puts
輸出結果,並呼叫 free
釋放動態分配的記憶體,以防止記憶體洩漏。
程式練習(費氏數列):
#include <iostream>
using namespace std;
int f(int n, int cache[]);
int main() {
int i, n, *cache;
cin >> n;
cache = new int[n + 1];
for (i = 0; i <= n; i++)
cache[i] = 0;
cout << "F(" << n << ") = " << f(n, cache) << "\n";
delete[] cache;
return 0;
}
int f(int n, int cache[]) {
if (cache[n] == 0) {
if (n == 0 || n == 1)
return 1;
else
cache[n] = f(n - 1, cache) + f(n - 2, cache);
}
return cache[n];
}
說明:
在 main
函數中,程式首先讀取用戶輸入的整數 n
,並動態分配一個大小為 n + 1
的整數陣列 cache
,用於存儲計算結果,然後初始化所有元素為0。接著,調用遞歸函數 f
計算第 n
個數,該函數使用緩存技術來避免重複計算,並返回結果。最後,程式輸出計算結果並釋放分配的記憶體。整體上,這段程式碼有效利用了記憶體和遞歸方法來優化數列的計算。
!!以上內容是跟著第一次學C++就上手第二版第13章一起做學習!!